package com.hmdp.lock;

/**
 * 互斥锁接口
 *      -- 分布式锁：
 *          -- 当集群的时候 由于会有多个锁监视器 所以就不能保证 userId.toString() 锁的key是唯一的
 *          -- 解决方案就是让他们使用同一个锁  Redis 的 setnx 命令
 *          -- 定义：满足在分布式集群模式下多个进程可见并且互斥的锁
 *      -- 基于 Redis 实现的分布式锁：
 *          -- 获取锁：
 *              -- setnx 第一个线程会获取成功 其他的线程会获取失败 只有线程1删除这个 key 的时候 其他线程才能获取到锁
 *          -- 释放锁：
 *              -- 释放锁的时候考虑的多一点儿 比如线程1释放的时候宕机了 怎么办 ?? 给所添加一个超时时间 而且设置锁和添加 expire 的代码要写在一起 避免还没来的及设置超时时间就挂机了
 *          -- 注意事项：
 *              -- setnx 的键名要根据业务名来取 值最好是线程的名字 因为后续释放锁的时候要知道这个锁是谁设置的 避免锁误删问题
 *              -- 为了避免阻塞 锁获取失败后直接返回错误信息
 */
public interface ILock {

    /**
     * 尝试获取锁
     * @param timeoutSec
     * @return
     */
    boolean tryLock(long timeoutSec);

    /**
     * 释放锁
     */
    void unlock();

}
